package cn.edu.zsc.rbac.service.impl;

import cn.edu.zsc.rbac.dao.collection.DeptDao;
import cn.edu.zsc.rbac.dao.collection.RoleDao;
import cn.edu.zsc.rbac.domain.dto.RoleDto;
import cn.edu.zsc.rbac.domain.entity.Role;
import cn.edu.zsc.rbac.domain.vo.Result;
import cn.edu.zsc.rbac.domain.vo.RoleVo;
import cn.edu.zsc.rbac.service.IRoleService;
import cn.edu.zsc.rbac.service.IUserService;
import cn.edu.zsc.rbac.util.SingletonFactory;

import java.time.LocalDateTime;

public class RoleService extends BaseService<Role, RoleDto, RoleVo, RoleDao> implements IRoleService {
    private IUserService userService;
    /**
     * 创建新的角色并将其存储到数据数组中。
     * <p>
     * 本⽅法接收⼀个 `RoleDto` 对象作为输⼊，使⽤其中的角色名称和角色数据访问创建⼀个新的角色对
     象。
     * 如果当前存储的角色数量没有超过最⼤容量限制，⽅法将为新角色分配⼀个 ID，并将其存储
     在数据数组中。
     * 如果存储容量已满，则返回创建失败的结果。
     * </p>
     *
     * @param dto 包含新角色信息的 `RoleDto` 对象
     * @return 返回⼀个包含操作结果的 `Result` 对象，表示创建是否成功
     */
    /**
     * 将角色实体对象转换为角色视图对象（RoleVo）。
     *
     * @param role 角色实体对象（Role），包含了角色的基本信息。
     * @return 返回转换后的角色视图对象（RoleVo），包含了角色的ID、名称和角色数据访问等信息。
     */
    @Override
    RoleVo convertToVo(Role role) {
        return new RoleVo(role.getId(),role.createAt,role.updateAt, role.name, role.dataScope);
    }
    @Override
    Role createEntity(RoleDto dto){
        LocalDateTime now = LocalDateTime.now();
        return new Role(null,now,now,dto.name,dto.dataScope);
    }
    @Override
    void updateEntity(RoleDto dto, Role role){
        role.updateAt = LocalDateTime.now();
        role.name= dto.name;
        role.dataScope= dto.dataScope;
    }
    /**
     * 获取所有有效的角色数据。
     * <p>
     * 本⽅法遍历存储角色数据的数组，将所有已创建且有效的角色（即 ID 对应的角色对象不为
     `null`）复制到⼀个临时数组中。
     * 然后返回查询成功的结果，并将该临时数组作为返回的数据。
     * </p>
     *
     * @return 返回⼀个 `Result` 对象，包含查询结果的状态和所有有效角色的数据
     */
    /**
     * 删除指定 ID 的角色。
     * <p>
     * 本⽅法通过传⼊的角色 ID 删除对应的角色数据。如果指定的 ID ⽆效（例如，ID ⼩于
     1、ID 超出有效范围，
     * 或者该 ID 对应的数据为 `null`），则返回删除失败的结果。
     * </p>
     *
     * @param id 需要删除的角色的 ID
     * @return 返回⼀个 `Result` 对象，表示删除操作是否成功
     */
    @Override
    public Result delete(int id) {
        // 检查提供的角色 ID 是否有效：ID ⼩于 1，ID 超出有效范围，或者该 ID 对应的数据为空
        if(!existsById(id)){
            return Result.failure("删除失败，不存在该数据");
        }
        if(userService==null){
            userService= SingletonFactory.getInstance(UserService.class);
        }
        if (userService.roleInUse(id)) {
            return Result.failure("删除失败，有⽤户具有该⻆⾊，不能删除");
        }
        // 将指定 ID 的角色数据置为 null，表示删除该数据
        dao.delete(id);
        // 返回删除成功的结果
        return Result.success("删除成功", null);
    }
    /**
     * 根据 ID 查找⻆⾊信息
     *
     * @param id ⻆⾊ ID
     * @return ⻆⾊实体对象，如果未找到则返回 null
     */
    /**
     * 单例模式
     */
    private RoleService() {
        dao = (RoleDao) SingletonFactory.getInstance(RoleDao.class);
        temp = new RoleVo[0];
    }
}
